package br.ucb.managedBean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
import br.ucb.JPA.JogadorDAO;
import br.ucb.JPA.JogoDAO;
import br.ucb.JPA.LigaDAO;
import br.ucb.JPA.PartidaDAO;
import br.ucb.negocio.Jogador;
import br.ucb.negocio.Jogo;
import br.ucb.negocio.Liga;
import br.ucb.negocio.Partida;
import br.ucb.util.Valida;

@ManagedBean(name="partidaMB")
@SessionScoped
public class PartidaManagedBean implements Serializable{
	private static final long serialVersionUID = 1L;
	
	private PartidaDAO dao = new PartidaDAO();
	LigaDAO daoLiga = new LigaDAO();
	JogoDAO daoJogo = new JogoDAO();
	JogadorDAO daoJogador = new JogadorDAO();
	
	private Partida partida;
	private List<Partida> partidas;

	//ACESSORES
	public Partida getPartida() {
		return partida;
	}
	public void setPartida(Partida partida) {
		this.partida = partida;
	}
	
	public List<Partida> getPartidas() {
		partidas  = dao.listar();		
		return partidas;
	}

	// Caixas de combina��es
	@SuppressWarnings("unused")
	private List<SelectItem> listaLiga;
	private Long ligaSelecionado;
	
	@SuppressWarnings("unused")
	private List<SelectItem> listaJogo;
	private Long jogoSelecionado;
	
	@SuppressWarnings("unused")
	private List<SelectItem> listaJogador_1;
	private Long jogador_1Selecionado;
	
	@SuppressWarnings("unused")
	private List<SelectItem> listaJogador_2;
	private Long jogador_2Selecionado;
	
	public List<SelectItem> getListaLiga() {
		ArrayList<SelectItem> lista = new ArrayList<SelectItem>();
		List<Liga> resultado = (List<Liga>) daoLiga.listar();

		for (Liga liga: resultado) {
			SelectItem item = new SelectItem(liga.getId(), liga.getNome() + " - " + liga.getDescricao());
			lista.add(item);
		}
		
		return lista;
	}
	
	public List<SelectItem> getListaJogo() {
		ArrayList<SelectItem> lista = new ArrayList<SelectItem>();

		StringBuilder sql = new StringBuilder("Select jogo.* from jogo ");
		sql.append("inner join liga_jogo on (liga_jogo.jogo_id = jogo.id and liga_jogo.liga_id = ");
		sql.append(ligaSelecionado);
		sql.append(");");

		List<Jogo> resultado = (List<Jogo>) daoJogo.consultaConjunto(sql.toString());

		for (Jogo jogo: resultado) {
			SelectItem item = new SelectItem(jogo.getId(), jogo.getNome());
			lista.add(item);
		}
		
		return lista;
	}

	public List<SelectItem> getListaJogador1() {
		ArrayList<SelectItem> lista = new ArrayList<SelectItem>();
		List<Jogador> resultado = (List<Jogador>) daoJogador.listar();

		for (Jogador jogador: resultado) {
			SelectItem item = new SelectItem(jogador.getId(), jogador.getApelido());
			lista.add(item);
		}
		
		return lista;
	}

	public List<SelectItem> getListaJogador2() {
		ArrayList<SelectItem> lista = new ArrayList<SelectItem>();
		List<Jogador> resultado = (List<Jogador>) daoJogador.listar();

		for (Jogador jogador: resultado) {
			SelectItem item = new SelectItem(jogador.getId(), jogador.getApelido());
			lista.add(item);
		}
		
		return lista;
	}
	
	public Long getJogador_1Selecionado() {
		return jogador_1Selecionado;
	}
	public void setJogador_1Selecionado(Long jogador_1Selecionado) {
		this.jogador_1Selecionado = jogador_1Selecionado;
	}

	public Long getJogador_2Selecionado() {
		return jogador_2Selecionado;
	}
	public void setJogador_2Selecionado(Long jogador_2Selecionado) {
		this.jogador_2Selecionado = jogador_2Selecionado;
	}

	
	public Long getLigaSelecionado() {
		return ligaSelecionado;
	}
	public void setLigaSelecionado(Long ligaSelecionado) {
		this.ligaSelecionado = ligaSelecionado;
	}
	
	public Long getJogoSelecionado() {
		return jogoSelecionado;
	}
	public void setJogoSelecionado(Long jogoSelecionado) {
		this.jogoSelecionado = jogoSelecionado;
	}
	// Fim - Caixas de combina��es

	
	//MÉTODOS(CRUD)
    public void prepararAdicionarPartida(ActionEvent actionEvent) {
        partida = new Partida();
    }

    public void adicionarPartida(ActionEvent actionEvent) {
    	FacesContext context = FacesContext.getCurrentInstance();

    	partida.setLiga(daoLiga.consultar(ligaSelecionado));
    	partida.setJogo(daoJogo.consultar(jogoSelecionado));
    	partida.setJogador1(daoJogador.consultar(jogador_1Selecionado));
    	partida.setJogador2(daoJogador.consultar(jogador_2Selecionado));
    	if(Valida.isPartida(partida)){	
            dao.incluir(partida);
            partida = new Partida();
    	}else{
    		context.addMessage(null, new FacesMessage("Erro", "Jogador Não pode disputar uma partida com ele mesmo"));
    	}	     			
    }

    public void alterarPartida(ActionEvent actionEvent){
    	partida.setLiga(daoLiga.consultar(ligaSelecionado));
    	partida.setJogo(daoJogo.consultar(jogoSelecionado));
    	partida.setJogador1(daoJogador.consultar(jogador_1Selecionado));
    	partida.setJogador2(daoJogador.consultar(jogador_2Selecionado));
    	dao.alterar(partida);
    	partida = new Partida();   	
    }

    public void excluirPartida() {
        dao.excluir(partida);
    }	
}
